package com.hainiu.cat.web.controller;

import com.hainiu.cat.web.config.DirectRabbitConfig;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * create by biji.zhao on 2021/6/4
 */
@RestController
public class SendDirectMessageController {
    /**
     * 通用返回提示语
     */
    private static final String RETURN_MESSAGE = "ok";

    /**
     * 模拟一台根本不存在的交换机
     */
    private static final String NO_EXIT_EXCHANGE = "non-existent-exchange";

    /**
     * 模拟直连交换机情形下根本不存在的routing-key
     */
    private static final String NO_EXIT_ROUTING= "asdfgh";

    /**
     * 使用RabbitTemplate,这提供了接收/发送等等方法
     */
    @Autowired
    RabbitTemplate rabbitTemplate;


    /**
     * 预期可以发送成功的消息
     * @param message 消息
     * @return 返回提示信息
     */
    @GetMapping("/sendDirectMessage")
    public String sendDirectMessage(String message) {
        //将消息携带绑定键值：TestDirectRouting 发送到交换机TestDirectExchange
        rabbitTemplate.convertAndSend(
                DirectRabbitConfig.TEST_DIRECT_EXCHANGE, DirectRabbitConfig.TEST_DIRECT_ROUTING, message
        );
        return RETURN_MESSAGE;
    }

    /**
     * 模拟交换机找不到的情形
     * @param message 传递的消息
     * @return 返回提示信息
     */
    @GetMapping("/testNoExchangeProviderACK")
    public String testNoExchangeProviderACK(String message) {
        //实际这个交换机根本就不存在,我们看看回调函数会为我们返回什么
        //此种情况连交换机都找不到,触发ConfirmCallback 显示 no-change
        rabbitTemplate.convertAndSend(NO_EXIT_EXCHANGE,  DirectRabbitConfig.TEST_DIRECT_ROUTING, message);
        return RETURN_MESSAGE;
    }

    /**
     * 模拟队列找不到的情形
     * @param message 传递的消息
     * @return 返回提示信息
     */
    @GetMapping("/testNoQueueProviderACK")
    public String testNoQueueProviderACK(String message) {
        //交换机lonelyDirectExchange已经存在,但是没有任何的配置,所以找不到对应的队列
        //两个回调函数 ReturnCallback 、ConfirmCallback都被调用 NO_ROUTE 告诉我们队列找不到
        rabbitTemplate.convertAndSend(DirectRabbitConfig.TEST_DIRECT_EXCHANGE_NO_HAVE__QUEUE, DirectRabbitConfig.TEST_DIRECT_ROUTING, message);
        /**
         * ===========setReturnCallback start=============
         * ReturnCallback消息：(Body:'海牛' MessageProperties [headers={}, contentType=text/plain, contentEncoding=UTF-8, contentLength=0, receivedDeliveryMode=PERSISTENT, priority=0, deliveryTag=0])
         * ReturnCallback回应码：312
         * ReturnCallback回应信息：NO_ROUTE
         * ReturnCallback交换机：LonelyExchange
         * ReturnCallback路由键：TestDirectRouting
         * ===========setReturnCallback end =============
         */
        return RETURN_MESSAGE;
    }

    /**
     * 模拟routing-key根本不存在的情形
     * @param message 传递的消息
     * @return 返回提示信息
     */
    @GetMapping("/testNoRoutingKeyProviderACK")
    public String testNoRoutingKeyProviderACK(String message) {
        //交换机lonelyDirectExchange已经存在,但是没有任何的配置,所以找不到对应的队列
        //两个回调函数 ReturnCallback 、ConfirmCallback都被调用 NO_ROUTE 告诉我们队列找不到
        /**
         * ===========setReturnCallback start=============
         * ReturnCallback消息：(Body:'海牛' MessageProperties [headers={}, contentType=text/plain, contentEncoding=UTF-8, contentLength=0, receivedDeliveryMode=PERSISTENT, priority=0, deliveryTag=0])
         * ReturnCallback回应码：312
         * ReturnCallback回应信息：NO_ROUTE
         * ReturnCallback交换机：TestDirectExchange
         * ReturnCallback路由键：asdfgh
         * ===========setReturnCallback end =============
         * ===========setConfirmCallback start=============
         * null
         * true
         * null
         * ===========setConfirmCallback end=============
         */
        rabbitTemplate.convertAndSend(DirectRabbitConfig.TEST_DIRECT_EXCHANGE, NO_EXIT_ROUTING, message);
        return RETURN_MESSAGE;
    }
}
